package br.uniceub.fsw.academicmobile.util;

import br.uniceub.fsw.academicmobile.vo.AlunoVO;
import br.uniceub.fsw.academicmobile.vo.DisciplinaVO;
import br.uniceub.fsw.academicmobile.vo.FrequenciaVO;
import br.uniceub.fsw.academicmobile.vo.MencaoVO;
import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import java.util.logging.Level;
import java.util.logging.Logger;
import org.jdom.*;
import org.jdom.input.*;

/**
 * Classe que recebe o arquivo XML e persiste no banco
 */
public class ImportarArquivoXml {
    
        //Comentários para testes e elicitações
	private File fileName;
	private String idProfessor= "";
	private String idCurso = "";
	private String idDisciplina = "";
	private String idAluno = "";
	private String idAlunoHistorico = "";
	private ArrayList disciplinasListDTO = new ArrayList();
	private SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd");
        
	public String getIdProfessor() {
		return idProfessor;
	}

	public ArrayList getDisciplinasListDTO() {
		return disciplinasListDTO;
	}

	public ImportarArquivoXml(File fileName) {
		this.fileName = fileName;
		montaColecao();
	}
	
	public void montaColecao() {
		disciplinasListDTO = new ArrayList();

		//Classe SAXBuilder que vai processar o XML4
		SAXBuilder sb = new SAXBuilder(false);

		//Este documento agora possui toda a estrutura do arquivo.
		Document d = null;
		try {
			d = sb.build(fileName);
		} catch (JDOMException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		//Recuperamos o elemento root
		Element elemen = d.getRootElement();
		idProfessor = elemen.getAttributeValue("id");
		System.out.println("ID Professor:"+idProfessor);
		System.out.println();

		//recuperar cursos
		Element cursos = elemen.getChild("cursos");

		List cursosList = cursos.getChildren();

		int qtdIteracoes = 0;
		//FOR curso
		for(int qtdCurso=0;qtdCurso<cursosList.size();qtdCurso++) {
			qtdIteracoes++;

			Element curso = (Element) cursosList.get(qtdCurso);
			idCurso = curso.getAttributeValue("id");
//			System.out.println("ID curso:"+idCurso);


			Element disciplinas = curso.getChild("disciplinas");
			List disciplinasList = disciplinas.getChildren();

			//FOR disciplina
			for(int qtdDisciplina=0;qtdDisciplina<disciplinasList.size();qtdDisciplina++) {
				ArrayList alunoListDTO = new ArrayList();
				DisciplinaVO disciplinaDTO;

				Element disciplina = (Element) disciplinasList.get(qtdDisciplina);
				idDisciplina = disciplina.getAttributeValue("id");
//				System.out.println("ID disciplina:"+idDisciplina);
//				System.out.println();

				Element alunos = disciplina.getChild("alunos");
				List alunosList = alunos.getChildren();

				//FOR aluno
				for(int qtdAluno=0;qtdAluno<alunosList.size();qtdAluno++) {
					AlunoVO alunoDTO = new AlunoVO();
					ArrayList mencoesListDTO = new ArrayList();
					ArrayList frequenciaListDTO = new ArrayList();

					System.out.println("-------------------------------");
					qtdIteracoes++;

					Element aluno = (Element) alunosList.get(qtdAluno);
					idAluno = aluno.getAttributeValue("id");
					idAlunoHistorico = aluno.getAttributeValue("historico"); 
//					System.out.println("ID aluno:"+idAluno);
//					System.out.println("ID Historico aluno:"+idAlunoHistorico);

					//frequencia
					//FOR frequencia
//					Element frequencias = aluno.getChild("frequencia");
					List frequenciasList = aluno.getChildren("frequencia");
					for(int qtdFrequencia=0;qtdFrequencia<frequenciasList.size();qtdFrequencia++) {
//						System.out.println("//////////////////////////////////////");
//						System.out.println("NUMERO FREQUENCIAS = "+qtdFrequencia);
						Element frequencia = (Element) frequenciasList.get(qtdFrequencia);
//						System.out.println("semestre:"+frequencia.getAttributeValue("semestre"));
//						System.out.println("//////////////////////////////////////");

						List mesesList = frequencia.getChildren();

//						String semestre = frequencia.getAttributeValue("semestre");
//						String ano = frequencia.getAttributeValue("ano");
//						System.out.println("semestre:"+semestre);
//						System.out.println("ano:"+ano);
//						System.out.println("qtd meses:"+mesesList.size());

						//FOR mes
						for(int qtdMes=0;qtdMes<mesesList.size();qtdMes++) {
							qtdIteracoes++;

							Element mes = (Element) mesesList.get(qtdMes);
							String mesNumero = mes.getAttributeValue("numero");
//							System.out.println("Mes:"+mesNumero);
							List diasList = mes.getChildren();
							//FOR aulas
							for(int qtdDia=0;qtdDia<diasList.size();qtdDia++) {
								qtdIteracoes++;
								Element aula = (Element) diasList.get(qtdDia);
								frequenciaListDTO.add(montaFrequencia(aula, mesNumero));
							}
						}



					}
					
					//mencoes
					Element mencoes = aluno.getChild("mencoes");
					List mencoesList = mencoes.getChildren();
//					System.out.println("qtd mencoes:"+mencoesList.size());

					//FOR mencoes
					for(int qtdMencao=0;qtdMencao<mencoesList.size();qtdMencao++) {
						qtdIteracoes++;
						Element mencao = (Element) mencoesList.get(qtdMencao);
						mencoesListDTO.add(montaMencao(mencao));
					}
					alunoDTO.setFrequencia(frequenciaListDTO);
					alunoDTO.setMencoes(mencoesListDTO);
					alunoDTO.setIdCdRa(new Long(idAluno));
					alunoDTO.setHistorico(idAlunoHistorico);
					alunoListDTO.add(alunoDTO);					

				}
				
				disciplinaDTO = new DisciplinaVO();
				disciplinaDTO.setAlunos(alunoListDTO);
				disciplinaDTO.setIdCdDisciplina(new Integer(idDisciplina));
				disciplinaDTO.setTbCursoIdCdCurso(new Integer(idCurso));
				disciplinasListDTO.add(disciplinaDTO);				
			}

		}
//		System.out.println("-------------------------------");
//		System.out.println("QTD ITERACOES = "+qtdIteracoes);
//		System.out.println("tamanho:"+disciplinasListDTO.size());
	}


	private FrequenciaVO montaFrequencia(Element aulaElem, String mes) {
		FrequenciaVO frequencia = new FrequenciaVO();

//		System.out.println("aula:"+aulaElem.getAttributeValue("numero"));
//		System.out.println("frequencia1:"+aulaElem.getChildText("presenca1"));
//		System.out.println("frequencia2:"+aulaElem.getChildText("presenca2"));

//		frequencia.setAno(ano);
//		frequencia.setDia(diaElem.getAttributeValue("numero"));
		frequencia.setDtMes(mes);
		frequencia.setTbAulaIdAula(new Integer(aulaElem.getAttributeValue("numero")));
		frequencia.setTpFrequencia1(aulaElem.getChildText("presenca1"));
		frequencia.setTpFrequencia2(aulaElem.getChildText("presenca2"));

		return frequencia;
	}

	private MencaoVO montaMencao(Element mencaoElem) {
		MencaoVO mencao = new MencaoVO();

//		System.out.println("****");
//		System.out.println("descricao:"+mencaoElem.getText());
//		System.out.println("data:"+mencaoElem.getAttributeValue("data"));
//		System.out.println("tipo:"+mencaoElem.getAttributeValue("tipo"));
//		System.out.println("sigla:"+mencaoElem.getAttributeValue("sigla"));		
//		System.out.println("****");

		mencao.setDsMencao(mencaoElem.getText());		
                try {
                    mencao.setDtMencao(formato.parse(mencaoElem.getAttributeValue("data")));
                } catch (ParseException ex) {
                    Logger.getLogger(ImportarArquivoXml.class.getName()).log(Level.SEVERE, null, ex);
                }
		mencao.setTbTipoMencaoIdTipoMencao(new Integer(mencaoElem.getAttributeValue("tipo")));		
		mencao.setTbSgMencaoIdTipoMencao(new Integer(mencaoElem.getAttributeValue("sigla")));
		return mencao;
	}
}
